package com.sky.service.impl;

import com.sky.context.BaseContext;
import com.sky.dto.ShoppingCartDTO;
import com.sky.entity.Dish;
import com.sky.entity.Setmeal;
import com.sky.entity.SetmealDish;
import com.sky.entity.ShoppingCart;
import com.sky.mapper.DishMapper;
import com.sky.mapper.SetMealDishMapper;
import com.sky.mapper.SetMealMapper;
import com.sky.mapper.ShoppingCartMapper;
import com.sky.service.ShoppingCartService;
import com.sky.vo.SetmealVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

@Service
public class ShoppingCartServiceImpl implements ShoppingCartService {
    @Autowired
    private ShoppingCartMapper shoppingCartMapper;
    @Autowired
    private DishMapper dishMapper;
    @Autowired
    private SetMealDishMapper setMealDishMapper;
    @Autowired
    private SetMealMapper setMealMapper;

    public void add(ShoppingCartDTO shoppingCartDTO)
    {    //将DTO转换成实体类对象准备插入到数据表中
        //判断当前购物车是否有该商品有的话，直接update一下数量就行了，否则才是插入
        //如果往购物车添加菜品(套餐)，只需要考虑数据库表是否有一模一样的数据
        ShoppingCart shoppingCart = new ShoppingCart();
        BeanUtils.copyProperties(shoppingCartDTO,shoppingCart);
        shoppingCart.setUserId(BaseContext.getCurrentId());
        List<ShoppingCart> list = shoppingCartMapper.getByDishIdOrSetmealid(shoppingCart);
        if(shoppingCartDTO.getDishId()!=null)//添加的菜品
        {

            if(list!=null && list.size()>0)//找到了数据只需要修改
            {
                shoppingCartMapper.update(list.get(0));
            }
            else  //新数据需要插入
            {
                Dish dish=dishMapper.getById(shoppingCartDTO.getDishId());
                shoppingCart.setName(dish.getName());
                shoppingCart.setImage(dish.getImage());
                shoppingCart.setAmount(dish.getPrice());
                shoppingCart.setNumber(1);
                shoppingCartMapper.add(shoppingCart);
            }
        }
        //如果往购物车添加套餐，因为没有套餐对应菜品id所以我必须要根据套餐id找到对应的菜品id（setmeal_dish），如果有一模一样的套餐数据（考虑userid，setmealid，其实感觉够了，当然也可以加菜品id）我要对套餐包含的多条数据进行update+1的操作。
        // 没有一模一样的套餐数据，要进行insert（）
        if(shoppingCartDTO.getDishId()==null)//添加的套餐
        {
//            list = shoppingCartMapper.getByDishIdOrSetmealid(shoppingCart);//查查购物车表中，根据套餐id，菜品id，userid
            if(list!=null && list.size()>0)//找到了数据只需要修改
            {
                shoppingCartMapper.update(list.get(0));
            }
            else  //新数据需要插入
            {
                shoppingCart.setUserId(BaseContext.getCurrentId());
                SetmealVO setmeal = setMealMapper.getBySetmealId(shoppingCartDTO.getSetmealId());
                shoppingCart.setName(setmeal.getName());
                shoppingCart.setImage(setmeal.getImage());
                shoppingCart.setAmount(setmeal.getPrice());
                shoppingCart.setNumber(1);
                shoppingCartMapper.add(shoppingCart);
            }

        }
        shoppingCart.setCreateTime(LocalDateTime.now());

    }

//    public void add(ShoppingCartDTO shoppingCartDTO)
//    {//将DTO转换成实体类对象准备插入到数据表中
//
//        //判断当前购物车是否有该商品有的话，直接update一下数量就行了，否则才是插入
//
//
//        //如果往购物车添加菜品，只需要考虑数据库表是否有一模一样的数据
//        ShoppingCart shoppingCart = new ShoppingCart();
//        BeanUtils.copyProperties(shoppingCartDTO,shoppingCart);
//
//        if(shoppingCartDTO.getDishId()!=null)//添加的菜品
//        {
////        ShoppingCart shoppingCart = new ShoppingCart();
////        BeanUtils.copyProperties(shoppingCartDTO,shoppingCart);
//
//            shoppingCart.setUserId(BaseContext.getCurrentId());
//            List<ShoppingCart> list = shoppingCartMapper.getByDishIdOrSetmealid(shoppingCart);
//            if(list!=null && list.size()>0)//找到了数据只需要修改
//            {
//                //    ShoppingCart obj = shoppingCartMapper.getByDishIdOrSetmealid(shoppingCartDTO);
//                shoppingCartMapper.update(list.get(0));
//            }
//            else  //新数据需要插入
//            {
//
//                //   BeanUtils.copyProperties(shoppingCartDTO,shoppingCart);
//
//                shoppingCart.setUserId(BaseContext.getCurrentId());
//                Dish dish=dishMapper.getById(shoppingCartDTO.getDishId());
//                shoppingCart.setName(dish.getName());
//                shoppingCart.setImage(dish.getImage());
//                shoppingCart.setAmount(dish.getPrice());
//                shoppingCart.setCreateTime(LocalDateTime.now());
//                shoppingCart.setNumber(1);
//                shoppingCartMapper.add(shoppingCart);
//            }
//        }
//
//
//        //如果往购物车添加套餐，因为没有套餐对应菜品id所以我必须要根据套餐id找到对应的菜品id（setmeal_dish），如果有一模一样的套餐数据（考虑userid，setmealid，其实感觉够了，当然也可以加菜品id）我要对套餐包含的多条数据进行update+1的操作。
//        // 没有一模一样的套餐数据，要进行insert（）
//        if(shoppingCartDTO.getDishId()==null)//添加的套餐
//        {
////            List<SetmealDish> setmealDishes = setMealDishMapper.SelectBySetmealId(shoppingCartDTO.getSetmealId());//套餐菜品中间表拿到套餐对应的菜品id
////            for(SetmealDish setmealDish:setmealDishes)
////            {
////                shoppingCart.setDishId(setmealDish.getDishId());
//                shoppingCart.setUserId(BaseContext.getCurrentId());
//                List<ShoppingCart> list = shoppingCartMapper.getByDishIdOrSetmealid(shoppingCart);//查查购物车表中，根据套餐id，菜品id，userid
//                if(list!=null && list.size()>0)//找到了数据只需要修改
//                {
//                    //    ShoppingCart obj = shoppingCartMapper.getByDishIdOrSetmealid(shoppingCartDTO);
//                    shoppingCartMapper.update(list.get(0));
//                }
//                else  //新数据需要插入
//                {
//
//                    //   BeanUtils.copyProperties(shoppingCartDTO,shoppingCart);
//
//                    shoppingCart.setUserId(BaseContext.getCurrentId());
////                    Dish dish=dishMapper.getById(shoppingCartDTO.getDishId());
////                    Dish dish=dishMapper.getById(setmealDish.getDishId());
////                    shoppingCart.setName(dish.getName());
////                    shoppingCart.setImage(dish.getImage());
////                    shoppingCart.setAmount(dish.getPrice());
//                    SetmealVO setmeal = setMealMapper.getBySetmealId(shoppingCartDTO.getSetmealId());
//                    shoppingCart.setName(setmeal.getName());
//                    shoppingCart.setImage(setmeal.getImage());
//                    shoppingCart.setAmount(setmeal.getPrice());
//                    shoppingCart.setCreateTime(LocalDateTime.now());
//                    shoppingCart.setNumber(1);
//                    shoppingCartMapper.add(shoppingCart);
//                }
////            }
//        }
//
//
//    }

//    @Override
//    public void add(ShoppingCartDTO shoppingCartDTO)
//    {//将DTO转换成实体类对象准备插入到数据表中
//
//        //判断当前购物车是否有该商品有的话，直接update一下数量就行了，否则才是插入
//
//
//        //如果往购物车添加菜品，只需要考虑数据库表是否有一模一样的数据
//        ShoppingCart shoppingCart = new ShoppingCart();
//        BeanUtils.copyProperties(shoppingCartDTO,shoppingCart);
//
//        if(shoppingCartDTO.getDishId()!=null)//添加的菜品
//        {
////        ShoppingCart shoppingCart = new ShoppingCart();
////        BeanUtils.copyProperties(shoppingCartDTO,shoppingCart);
//
//            shoppingCart.setUserId(BaseContext.getCurrentId());
//            List<ShoppingCart> list = shoppingCartMapper.getByDishIdOrSetmealid(shoppingCart);
//            if(list!=null && list.size()>0)//找到了数据只需要修改
//            {
//                //    ShoppingCart obj = shoppingCartMapper.getByDishIdOrSetmealid(shoppingCartDTO);
//                shoppingCartMapper.update(list.get(0));
//            }
//            else  //新数据需要插入
//            {
//
//                //   BeanUtils.copyProperties(shoppingCartDTO,shoppingCart);
//
//                shoppingCart.setUserId(BaseContext.getCurrentId());
//                Dish dish=dishMapper.getById(shoppingCartDTO.getDishId());
//                shoppingCart.setName(dish.getName());
//                shoppingCart.setImage(dish.getImage());
//                shoppingCart.setAmount(dish.getPrice());
//                shoppingCart.setCreateTime(LocalDateTime.now());
//                shoppingCart.setNumber(1);
//                shoppingCartMapper.add(shoppingCart);
//            }
//        }
//
//
//        //如果往购物车添加套餐，因为没有套餐对应菜品id所以我必须要根据套餐id找到对应的菜品id（setmeal_dish），如果有一模一样的套餐数据（考虑userid，setmealid，其实感觉够了，当然也可以加菜品id）我要对套餐包含的多条数据进行update+1的操作。
//        // 没有一模一样的套餐数据，要进行insert（）
//        if(shoppingCartDTO.getDishId()==null)//添加的套餐
//        {
//            List<SetmealDish> setmealDishes = setMealDishMapper.SelectBySetmealId(shoppingCartDTO.getSetmealId());//套餐菜品中间表拿到套餐对应的菜品id
//            for(SetmealDish setmealDish:setmealDishes)
//            {
//                shoppingCart.setDishId(setmealDish.getDishId());
//                shoppingCart.setUserId(BaseContext.getCurrentId());
//                List<ShoppingCart> list = shoppingCartMapper.getByDishIdOrSetmealid(shoppingCart);//查查购物车表中，根据套餐id，菜品id，userid
//                if(list!=null && list.size()>0)//找到了数据只需要修改
//                {
//                    //    ShoppingCart obj = shoppingCartMapper.getByDishIdOrSetmealid(shoppingCartDTO);
//                    shoppingCartMapper.update(list.get(0));
//                }
//                else  //新数据需要插入
//                {
//
//                    //   BeanUtils.copyProperties(shoppingCartDTO,shoppingCart);
//
//                    shoppingCart.setUserId(BaseContext.getCurrentId());
//                    Dish dish=dishMapper.getById(shoppingCartDTO.getDishId());
////                    Dish dish=dishMapper.getById(setmealDish.getDishId());
////                    shoppingCart.setName(dish.getName());
////                    shoppingCart.setImage(dish.getImage());
////                    shoppingCart.setAmount(dish.getPrice());
//                    SetmealVO setmeal = setMealMapper.getBySetmealId(shoppingCartDTO.getSetmealId());
//                    shoppingCart.setName(setmeal.getName());
//                    shoppingCart.setImage(setmeal.getImage());
//                    shoppingCart.setAmount(setmeal.getPrice());
//                    shoppingCart.setCreateTime(LocalDateTime.now());
//                    shoppingCart.setNumber(1);
//                    shoppingCartMapper.add(shoppingCart);
//                }
//            }
//        }
//
//
//    }

    @Override
    public List<ShoppingCart> list() {

        List<ShoppingCart> list = shoppingCartMapper.list(BaseContext.getCurrentId());
        return list;
    }

    @Override
    public void clean() {
        shoppingCartMapper.clean(BaseContext.getCurrentId());
    }

    @Override
    public void sub(ShoppingCartDTO shoppingCartDTO) {
        shoppingCartMapper.sub(shoppingCartDTO,BaseContext.getCurrentId());
        //查询一下购物车表的商品数量是否为0，为0就删除对应商品
        shoppingCartMapper.delete();//感觉不用userid，因为a人调用了这个方法，会检查整个表所有数量为0的数据进行删除，可能会删除b人购物车商品数量为0商品的数据，但是b人购物车商品数量为0不就说明要删掉这个商品还没有删除吗，
        // 感觉就是a线程刚做完update就被b线程插队，b删除了a人购物车商品数量为0（整个表数量为0）的数据，那么a线程的delete就相当于做了个空，因为已经被b线程抢先做完了，但是我觉得不影响，毕竟删的是商品数量为0的数据即使是不同人的购物车。




    }
//老师写的
//    public void subShoppingCart(ShoppingCartDTO shoppingCartDTO) {
//        ShoppingCart shoppingCart = new ShoppingCart();
//        BeanUtils.copyProperties(shoppingCartDTO,shoppingCart);
//        //设置查询条件，查询当前登录用户的购物车数据
//        shoppingCart.setUserId(BaseContext.getCurrentId());
//
//        List<ShoppingCart> list = shoppingCartMapper.list(shoppingCart);
//
//        if(list != null && list.size() > 0){
//            shoppingCart = list.get(0);
//
//            Integer number = shoppingCart.getNumber();
//            if(number == 1){
//                //当前商品在购物车中的份数为1，直接删除当前记录
//                shoppingCartMapper.deleteById(shoppingCart.getId());
//            }else {
////                当前商品在购物车中的份数不为1，修改份数即可
//                shoppingCart.setNumber(shoppingCart.getNumber() - 1);
//                shoppingCartMapper.update(shoppingCart);
//            }
//        }
//    }
}
